<?php

namespace maotool\util;

class DateUtil
{

    /**
     * 当前时间，转换为{@link DateTime}对象
     * @param $format
     * @param $timestamp
     * @return false|string 当前时间
     */
    public static function date($format = 'Y-m-d H:i:s', $timestamp = null)
    {
        if (is_null($timestamp)) {
            return date($format);
        } else {
            return date($format, $timestamp);
        }
    }

    /**
     * 当前时间，转换为{@link DateTime}对象
     * @param $format
     * @param $timestamp
     * @return false|string 当前时间
     */
    public static function now($format = 'Y-m-d H:i:s', $timestamp = null)
    {
        if (is_null($timestamp)) {
            return date($format);
        } else {
            return date($format, $timestamp);
        }
    }

    /**
     * 获取当前时间的微秒部分
     *
     * @return int 微秒数
     */
    public static function currentMicroseconds()
    {
        return (int)((microtime(true) - floor(microtime(true))) * 1000000);
    }

    /**
     * 格式化包含微秒的时间
     *
     * @param string $format 日期格式
     * @param float|null $microtime 微秒时间戳
     * @return string 格式化后的时间（包含微秒）
     */
    public static function dateWithMicroseconds($format = 'Y-m-d H:i:s.u', $microtime = null)
    {
        if ($microtime === null) {
            $microtime = microtime(true);
        }
        $seconds = floor($microtime);
        $microseconds = ($microtime - $seconds) * 1000000;

        $date = date($format, $seconds);
        return str_replace('u', sprintf('%06d', $microseconds), $date);
    }

    /**
     * 当前时间，转换为{@link DateTime}对象
     *
     * @return string 当前时间
     */
    public static function dateCn()
    {
        return date('Y年m月d日 H时i分s秒');
    }

    /**
     * 当前时间的时间戳
     *
     * @return float 时间
     */
    public static function current()
    {
        return round(microtime(true) * 1000);
    }

    /**
     * 当前时间的时间戳（秒）
     *
     * @return int 当前时间秒数
     */
    public static function currentSeconds()
    {
        return time();
    }

    /**
     * 获取指定月份的第一天
     *
     * @param int $year 年份
     * @param int $month 月份
     * @param string $format 日期格式，默认为 Y-m-d
     * @return string 指定月份第一天日期
     */
    public static function firstDayOfMonth($year = null, $month = null, $format = 'Y-m-d')
    {
        if ($year === null) {
            $year = date('Y');
        }
        if ($month === null) {
            $month = date('m');
        }
        return date($format, mktime(0, 0, 0, $month, 1, $year));
    }

    /**
     * 获取指定月份的最后一天
     *
     * @param int $year 年份
     * @param int $month 月份
     * @param string $format 日期格式，默认为 Y-m-d
     * @return string 指定月份最后一天日期
     */
    public static function lastDayOfMonth($year = null, $month = null, $format = 'Y-m-d')
    {
        if ($year === null) {
            $year = date('Y');
        }
        if ($month === null) {
            $month = date('m');
        }
        return date($format, mktime(0, 0, 0, $month + 1, 0, $year));
    }

    /**
     * 获取指定年份的第一天
     *
     * @param int $year 年份，默认为当前年份
     * @param string $format 日期格式，默认为 Y-m-d
     * @return string 指定年份第一天日期
     */
    public static function firstDayOfYear($year = null, $format = 'Y-m-d')
    {
        if ($year === null) {
            $year = date('Y');
        }
        return date($format, mktime(0, 0, 0, 1, 1, $year));
    }

    /**
     * 获取指定年份的最后一天
     *
     * @param int $year 年份，默认为当前年份
     * @param string $format 日期格式，默认为 Y-m-d
     * @return string 指定年份最后一天日期
     */
    public static function lastDayOfYear($year = null, $format = 'Y-m-d')
    {
        if ($year === null) {
            $year = date('Y');
        }
        return date($format, mktime(0, 0, 0, 12, 31, $year));
    }

    /**
     * 获取指定周的第一天（周一）
     *
     * @param int $year 年份，默认为当前年份
     * @param int $week 周数，默认为当前周
     * @param string $format 日期格式，默认为 Y-m-d
     * @return string 指定周第一天日期
     */
    public static function firstDayOfWeek($year = null, $week = null, $format = 'Y-m-d')
    {
        if ($year === null) {
            $year = date('Y');
        }
        if ($week === null) {
            $week = date('W');
        }
        return date($format, strtotime($year . 'W' . sprintf('%02d', $week)));
    }

    /**
     * 获取指定周的最后一天（周日）
     *
     * @param int $year 年份，默认为当前年份
     * @param int $week 周数，默认为当前周
     * @param string $format 日期格式，默认为 Y-m-d
     * @return string 指定周最后一天日期
     */
    public static function lastDayOfWeek($year = null, $week = null, $format = 'Y-m-d')
    {
        if ($year === null) {
            $year = date('Y');
        }
        if ($week === null) {
            $week = date('W');
        }
        return date($format, strtotime($year . 'W' . sprintf('%02d', $week) . ' +6 days'));
    }

    /**
     * 获取今天是几号
     *
     * @param bool $withLeadingZero 是否补零，默认true
     * @return string 今天的日期号码
     */
    public static function todayNumber($withLeadingZero = true)
    {
        return date($withLeadingZero ? 'd' : 'j');
    }

    /**
     * 获取指定时间戳是几号
     *
     * @param int|null $timestamp 时间戳，默认为当前时间
     * @param bool $withLeadingZero 是否补零，默认true
     * @return string 指定时间的日期号码
     */
    public static function dayNumber($timestamp = null, $withLeadingZero = true)
    {
        if ($timestamp === null) {
            $timestamp = time();
        }
        return date($withLeadingZero ? 'd' : 'j', $timestamp);
    }

}